1. Hadoop 伪分布式

Hadoop 中的组件

1.x 版本

HDFS 负责大数据的存储,Common: HDFS和MR共有的常用的工具包模块,MapReduce: 负责计算,负责计算资源的申请的调度!

2.x 版本

HDFS(框架):负责大数据的存储
YARN(框架): 负责大数据的资源调度

MR(编程模型): 使用 Hadoop制定的 编程要求,编写程序,完成大数据的计算!

区别

1.x 和2.x 的区别是将资源调度和管理进行分离!由统一的资源调度平台 YARN 进行大数据计算资源的调度!提升了Hadoop的通用性!Hadoop搭建的集群中的计算资源,不仅可以运行Hadoop中的MR程序!也可以运行其他计算框架的程序!在hadoop不久之后,由于MR的低效性,出现了许多更为高效的计算框架!例如: Tez,Storm, Spark,Flink

HDFS

负责大数据的存储,包含以下进程:

  1. Namenode (必须存在,且1个): 负责文件,名称等元数据(属性信息-文件名,大小,文件切分了多少块(block),创建和修改时间等)的存储!Namenode 主要是接受客户端的请求,接受DN的请求!向DN分配任务!
  2. Datanode (必须存在,可以N个): 负责文件中数据的存储!主要负责接受NM分配的任务!负责数据块(block) 的管理(读,写)。
  3. SecondaryNamenode (不一定存在,可以是N个): 负责辅助 NameNode工作!

HDFS 的运行模式有两种,一种是本地,另一种是分布式。可以在 core-default.xml 中进行配置,如果是 fs.defaultFS=file:///(默认) 那么就是本地模式,如果是 fs.defaultFS=hdfs:// 那么就是分布式模式。

MapReduce

MapReduce(编程规范): 程序中有 Mapper (简单处理)和 Reducer (合并)。遵循MapReduce的编程规范,编写的程序,打包后,称为一个 Job(任务),Job 需要提交到 YARN上,向 YARN 申请计算资源,运行Job中的Task(进程),Job 会先创建一个进程 MRAppMaster(mapreduce 应用管理者),由 MRAppMaster 向 YARN 申请,MRAppMaster 负责监控 Job中各个Task运行情况,进行容错管理!

MapReduce 也有两种运行模式。如果配置是 mapreduce.framework.name=local(默认)那么是本地运行,如果是 mapreduce.framework.name=yarn,那么就是在 yarn 上运行。

YARN

YARN负责集群中所有计算资源的管理和调度!常见进程:

  1. ResourceManager (1个): 负责整个集群所有资源的管理!主要负责接受客户端的提交 Job 的请求!负责向NM分配任务!负责接受NM上报的信息!

  2. NodeManager (N个): 负责单台计算机所有资源的管理!负责和 RM进行通信,上报本机中的可用资源!负责领取 RM 分配的任务!负责为 Job 中的每个 Task 分配计算资源!

    为了防止当前Task在使用这些资源期间,被其他的task抢占资源!将计算资源,封装到一个Container中,在Container中的资源,会被暂时隔离!无法被其他进程所抢占!当前Task运行结束后,当前Container中的资源会被释放!允许其他task来使用!

Hadoop 的安装

安装 JDK

上传 jdk-8u121-linux-x64.tar.gz 到 /opt/soft 目录,并进行解压到 /opt/module 下。编辑 /etc/profile,在最后添加如下信息

1
2
3
4
JAVA_HOME=/opt/module/jdk1.8.0_121
PATH=$PATH:$JAVA_HOME/bin

export JAVA_HOME PATH

配置 HOST 映射

在 Hadoop 中启动多种不同类型的进程,例如 NN,DN,RM,NM,这些进程需要进行通信!在通信时,常用主机名进行通信,所以需要配置集群中所有机器的host映射。编辑 /etc/hosts 文件,添加以下记录,hadoop10 是当前机器的主机名。

1
192.168.1.10 hadoop10

创建并使用普通用户

创建 rexyan 用户

1
2
useradd rexyan
passwd rexyan

赋予管理员权限, 编辑 /etc/sudoers 文件,在 root 下面添加 rexyan 用户不需要密码登录

1
2
root    ALL=(ALL)       ALL
rexyan ALL=(ALL) NOPASSWD: ALL

将 /opt/module/ /opt/soft/ 两个目录的权限改为 rexyan 用户

1
sudo chown -R rexyan:rexyan /opt/module/ /opt/soft/

关闭防火墙

关闭防火墙,并设置开机不启动

1
2
sudo service iptables stop
sudo chkconfig iptables off

安装 Hadoop

将在 linux 编译后的 jar 包上传到 /opt/soft 下, 并解压到 /opt/module 目录下

1
tar zxvf hadoop-2.7.2.tar.gz -C /opt/module/

添加环境变量

1
2
3
4
5
6

JAVA_HOME=/opt/module/jdk1.8.0_121
HADOOP_HOME=/opt/module/hadoop-2.7.2
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export JAVA_HOME PATH HADOOP_HOME

执行 hadoop version 验证是否安装成功

1
hadoop version

Hadoop 的配置文件

Hadoop 有 4 个默认的配置文件, 在 HADOOP_HOME/share/ 下的 jar 包中

1
2
3
4
core-default.xml: 设置hadoop最核心的参数!
hdfs-default.xml 保存的是hdfs相关的参数!
mapred-default.xml: MR程序在运行时,需要使用的参数!
yarn-default.xml: yarn在启动时,需要的参数!

用户可以自定义 4 个自定义配置文件

1
2
3
4
core-site.xml: 用户自定义的hadoop最核心的参数!
hdfs-site.xml 用户自定义的hdfs相关的参数!
mapred-site.xml: 用户自定义的MR程序在运行时,需要使用的参数!
yarn-site.xml: 用户自定义的yarn在启动时,需要的参数!

用户自定义的配置文件,可以覆盖默认配置文件中同名的参数的值。Hadoop在启动时,先加载4个默认的配置文件,再加载用户自定义的配置文件,如果用户自定义的配置文中有和4个默认配置文件中门的参数,可以覆盖之前已经加载的值!

在使用 hadoop 命令时可以自定义配置文件的目录: hadoop –config 配置文件的目录,如果没有配置,默认读取 HADOOP_HOME/etc/hadoop 中对应的配置文件。

HDFS 本地模式的使用

HDFS 默认是本地模式的,在 rexyan 用户家目录中新建 hello 文件,并上传到本地的 hdfs

1
hadoop fs -put /home/rexyan/hello /opt/module/

上面的命令的意思是将 /home/rexyan/hello 文件,上传到 hdfs 的 /opt/module/ 路径下

还可以进行文件的下载,例如将 hdfs 上的/opt/module/hello 文件下载到 /tmp/hello 中

1
hadoop fs -get /opt/module/hello  /tmp/hello

HDFS 分布式模式的使用

修改 /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml 配置文件,配置 HDFS 为分布式模式,并配置 NameNode 的地址和端口信息。并且指定 hadoop 运行时产生的临时文件的存储位置。

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<properties>
<name>fs.defaultFS</name>
<value>hdfs://hadoop10:9000</value>
</properties>

<properties>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</properties>
</configuration>

上面将 hadoop 的临时文件改为了 /opt/module/hadoop-2.7.2/data/tmp,需要格式化 namenode,目的的是生成 /opt/module/hadoop-2.7.2/data/tmp目录,在目录下生成其他文件。

1
hadoop namenode -format

使用 tree 命令查看 /opt/module/hadoop-2.7.2/data/tmp目录,发现下面已经生成了一些文件

启动 NameNode 和 DataNode, 并使用 jps 命令查看启动状态。如果启动失败,可以在 /opt/module/hadoop-2.7.2/logs 目录下查看失败日志。

1
2
hadoop-deamon.sh start namenode
hadoop-deamon.sh start datanode

NameNode 启动之后,可以使用 web 页面来访问,地址就是机器所在的地址 + 50070 端口,即 http://192.168.1.10:50070/ 能访问到以下界面就说明 namenode 没有什么问题了。

namenode 启动完成之后,就可以启动 datanode

1
hadoop-daemon.sh start datanode

可以使用 jps 或者网页查询是否启动成功

如果 namenode 和 datanode 都启动成功了,那么就说明 hdfs 的配置没有什么问题了,可以上传一个文件试试

1
hadoop fs -put hello /

在网页上也就能看到上传的文件了

现在 NN 和 DN 都在同一台机器,且只有一个 DN 节点,我们称这样的分布式为伪分布式。

MapReduce 本地模式的使用

在 /opt/module/hadoop-2.7.2/share/hadoop/mapreduce 目录下,hadoop 提供了 mapreduce 的示例 jar 包程序。如下命令表示,运行 hadoop-mapreduce-examples-2.7.2.jar 这个 jar 包,并且执行 wordcount 单词统计功能,统计 hdfs 上 / 下面的所有文件,将统计结果存放到 hdfs 的 /wc 中

1
hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount / /wc

执行结束后就能看到 wc 结果文件

或者执行 hadoop fs -cat /wc/part-r-0000 命令查看 part-r-0000 是生成目录下的块文件,真正存放数据的地方

1
hadoop fs -cat /wc/part-r-0000

MapReduce 在 Yarn 上的使用

在 yarn 上运行 MapReduce,需要配置 MapReduce 的运行模式为 yarn。复制一个示例的配置文件,并将名字改为 mapred-site.xml。编辑 mapred-site.xml 文件,配置如下内容

1
2
cd /opt/module/hadoop-2.7.2/etc/hadoop
cp mapred-site.xml.template mapred-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

上面我们配置了在 yarn 上运行 MapReduce,所以我们需要配置和启动 yarn(RM 和 NM)。编辑 yarn-site.xml 配置如下内容。配置文件代表了在 hadoop10 这台机器上运行 yarn 的 ResourceManager 程序,并指定 nodemanager 获取数据的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
<!-- 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop10</value>
</property>
</configuration>

启动 RM 和 NM 进程

1
2
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager

还可以通过 yarn 的网页来判断 yarn 是否启动成功 http://192.168.1.10:8088/cluster

启动 yarn 之后,再次提交任务,那么就不在是本地运行了。

1
hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount /hello /wc2

查看结果数据